package com.chenfan.mcn.model.dto;

import com.chenfan.mcn.constant.McnConstant;
import com.chenfan.common.extension.validation.groups.Modify;
import com.chenfan.mcn.model.DocIntentionOrderQuestion;
import com.chenfan.mcn.utils.CommonUtil;
import lombok.Data;
import org.apache.commons.lang3.ObjectUtils;

import javax.validation.constraints.*;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;
import java.util.List;

/**
 * 意向单-保存DTO
 * @author wulg
 * @date 2022/10/27
 */
@Data
public class IntentionOrderSaveDTO implements Serializable {

    /**
     * 意向单ID
     */
    @NotNull(message ="意向单ID不能为空" , groups ={Modify.class})
    private Long id;

    /**
     * 意向单号
     */
    private String intentionCode;

    /**
     * 客户id
     */
    @NotNull(message = "【客户】必选")
    private Long customerId;

    /**
     * 红人id
     */
    @NotNull(message = "【红人】必选")
    private Long starId;

    /**
     * 红人平台id（发布平台）
     */
    @NotNull(message = "【红人】必选")
    private Long starPlatformInfoId;

    /**
     * 产品名称
     */
    @NotBlank(message = "【产品名称】必填")
    private String productName;

    /**
     * 合作品牌
     */
    @NotBlank(message = "【品牌】必选")
    private String cooperateBrand;

    /**
     * 发布形式（数据字典Publishing_platform二级字典）
     */
    @NotBlank(message = "【发布形式】必选")
    private String publishForm;

    /**
     * 发布日期开始时间
     */
    @NotNull(message = "【发布日期】必选")
    private Date publishDate;

    /**
     * 发布日期结束时间
     */
    @NotNull(message = "【发布日期】必选")
    private Date publishDateEnd;

    /**
     * 是否平台下单：0否1是
     */
    @NotNull(message = "【是否平台下单】必选")
    private Integer fromMicroTask;

    /**
     * 是否直播合作广告：0否、1是
     */
    @NotNull(message = "【是否直播合作广告】必选")
    private Integer isLiveAd;

    /**
     * 是否挂车/橱窗/组件 默认否
     */
    @NotNull(message = "【是否挂车/橱窗/组件】必选")
    private Integer haveLinkCommand;

    /**
     * 刊例原价（元）
     */
    @Digits(integer = 10, fraction = 2, message = "【刊例原价（元）】数值必须大于等于0，其中整数位最多{integer}位，小数位最多{fraction}位")
    private BigDecimal cardRatePrice;


    /**
     * 内容实际报价（原：本单金额）
     */
    @NotNull(message = "【内容实际报价（元）】必填")
    @Digits(integer = 10, fraction = 2, message = "【内容实际报价（元）】数值必须大于等于0，其中整数位最多{integer}位，小数位最多{fraction}位")
    private BigDecimal orderAmount;

    /**
     * 其他加价收入（元）
     */
    @NotNull(message = "【其他加价收入（元）】必填")
    @Digits(integer = 10, fraction = 2, message = "【其他加价收入（元）】数值必须大于等于0，其中整数位最多{integer}位，小数位最多{fraction}位")
    private BigDecimal otherIncomeAmount;

    /**
     * 其他加价收入说明
     */
    @Size(max = 300, message = "【其他加价收入说明】长度不能超过{max}个字符")
    private String otherIncomeRemark;

    /**
     * 平台手续费/微任务金额（元）
     */
    @NotNull(message = "【平台手续费/微任务金额（元）】必填")
    @Digits(integer = 10, fraction = 2, message = "【平台手续费/微任务金额（元）】数值必须大于等于0，其中整数位最多{integer}位，小数位最多{fraction}位")
    private BigDecimal platformFeeAmount;

    /**
     * 机酒差旅补贴（元）
     */
    @NotNull(message = "【机酒差旅补贴（元）】必填")
    @Digits(integer = 10, fraction = 2, message = "【机酒差旅补贴（元）】数值必须大于等于0，其中整数位最多{integer}位，小数位最多{fraction}位")
    private BigDecimal specialIncomeAmount;

    /**
     * 机酒差旅补贴说明
     */
    @Size(max = 300, message = "【机酒差旅补贴说明】长度不能超过{max}个字符")
    private String specialIncomeRemark;

    /**
     * 其他补贴性收入（元）
     */
    @NotNull(message = "【其他补贴性收入（元）】必填")
    @Digits(integer = 10, fraction = 2, message = "【其他补贴性收入（元）】数值必须大于等于0，其中整数位最多{integer}位，小数位最多{fraction}位")
    private BigDecimal subsidyIncomeAmount;

    /**
     * 其他补贴性收入说明
     */
    private String subsidyIncomeRemark;

    /**
     * 内容报价返点金额（元）
     */
    @NotNull(message = "【内容报价返点金额（元）】必填")
    @Digits(integer = 10, fraction = 2, message = "【内容报价返点金额（元）】数值必须大于等于0，其中整数位最多{integer}位，小数位最多{fraction}位")
    private BigDecimal rebateAmount;

    /**
     * 执行人id
     */
    @NotNull(message = "【执行人】必选")
    private Long excutorId;

    /**
     * 执行人名称
     */
    @NotBlank(message = "【执行人】必选")
    private String excutorName;

    /**
     * 红人经纪人id
     */
    @NotNull(message = "【经纪人】必选")
    private Long starAgentId;

    /**
     * 红人经纪人名称
     */
    @NotBlank(message = "【经纪人】必选")
    private String starAgentName;

    /**
     * 备注
     */
    @Size(max = 500, message = "【备注】长度不能超过{max}个字符")
    private String remark;

    /**
     * 是否有折扣返点审批：0否、1是
     */
    @NotNull(message = "【是否有折扣返点审批】必选")
    private Integer haveDiscountApproval;

    /**
     * 折扣返点审批截图
     */
    private String discountScreenshot;

    /**
     * 询单问题
     */
    private List<DocIntentionOrderQuestion> questionList;


    /**
     * 获取总收入金额
     * @return
     */
    public BigDecimal getTotalIncomeAmount() {
        return ObjectUtils.defaultIfNull(this.orderAmount, BigDecimal.ZERO)
                .add(ObjectUtils.defaultIfNull(this.otherIncomeAmount, BigDecimal.ZERO))
                .add(ObjectUtils.defaultIfNull(this.platformFeeAmount, BigDecimal.ZERO))
                .add(ObjectUtils.defaultIfNull(this.specialIncomeAmount, BigDecimal.ZERO)
                .add(ObjectUtils.defaultIfNull(this.subsidyIncomeAmount, BigDecimal.ZERO)));
    }

    /**
     * 获取本单实际优惠比例（%）
     * 本单实际优惠比例=（刊例原价-内容实际报价）/刊例原价*100+返点比例
     * @return
     */
    public BigDecimal getActualDiscountRatio() {
        if(CommonUtil.greaterThanZero(this.cardRatePrice)) {
            BigDecimal diffAmount = this.cardRatePrice.subtract(ObjectUtils.defaultIfNull(this.orderAmount, BigDecimal.ZERO))
                    .add(ObjectUtils.defaultIfNull(this.rebateAmount, BigDecimal.ZERO));
            return diffAmount.multiply(McnConstant.ONE_HUNDRED).divide(this.cardRatePrice, 2, BigDecimal.ROUND_HALF_UP);
        }
        return null;
    }

    /**
     * 内容报价返点比例（%）
     * @return
     */
    public BigDecimal getRebate() {
        if(CommonUtil.greaterThanZero(this.orderAmount)) {
            return ObjectUtils.defaultIfNull(this.rebateAmount, BigDecimal.ZERO)
                    .multiply(McnConstant.ONE_HUNDRED)
                    .divide(this.orderAmount, 2, BigDecimal.ROUND_HALF_UP);
        }
        return BigDecimal.ZERO;
    }
}
